package com.rolerealm.common.exception;

import com.rolerealm.common.constant.ErrorCode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;

/**
 * 基础业务异常类
 * 所有业务异常都应该继承此类
 * 
 * @author RoleRealm Team
 * @version 1.0.0
 */
@Getter
@EqualsAndHashCode(callSuper = true)
@Data
public class BaseException extends RuntimeException {

    /**
     * 错误码
     * -- GETTER --
     *  获取错误码
     *
     * @return 错误码

     */
    private final ErrorCode errorCode;

    /**
     * 错误详情
     * -- GETTER --
     *  获取错误详情
     *
     * @return 错误详情

     */
    private final String detail;

    /**
     * 构造方法
     * 
     * @param errorCode 错误码
     */
    public BaseException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
        this.detail = null;
    }

    /**
     * 构造方法
     * 
     * @param errorCode 错误码
     * @param detail 错误详情
     */
    public BaseException(ErrorCode errorCode, String detail) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
        this.detail = detail;
    }

    /**
     * 构造方法
     * 
     * @param errorCode 错误码
     * @param cause 原因异常
     */
    public BaseException(ErrorCode errorCode, Throwable cause) {
        super(errorCode.getMessage(), cause);
        this.errorCode = errorCode;
        this.detail = null;
    }

    /**
     * 构造方法
     * 
     * @param errorCode 错误码
     * @param detail 错误详情
     * @param cause 原因异常
     */
    public BaseException(ErrorCode errorCode, String detail, Throwable cause) {
        super(errorCode.getMessage(), cause);
        this.errorCode = errorCode;
        this.detail = detail;
    }

    @Override
    public String toString() {
        return "BaseException{" +
                "errorCode=" + errorCode +
                ", detail='" + detail + '\'' +
                ", message='" + getMessage() + '\'' +
                '}';
    }
}
